#pragma once
#include<string>
#include<unordered_map>

namespace rpc
{
    //json value xx["xxx"] -> xxx = KEY_METHOD......
    #define KEY_METHOD "method"
    #define KEY_PARAME "parameters"
    #define KEY_TOPIC_KEY "topic_key"
    #define KEY_TOPIC_MSG "topic_msg"
    #define KEY_OPTYPE "optype"
    #define KEY_HOST "host"
    #define KEY_HOST_IP "ip"
    #define KEY_HOST_PORT "port"
    #define KEY_RCODE "rcode"
    #define KEY_RESULT "result"

    //消息类型
    enum class MType
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };
    //响应码
    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };
    static std::string errReason(RCode code)
    {
        static std::unordered_map<RCode, std::string> err_map ={
            {RCode::RCODE_OK, "Success"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败"},
            {RCode::RCODE_INVALID_MSG, "无效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开"},
            {RCode::RCODE_INVALID_PARAMS, "无效Rpc参数!"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应服务"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作视频"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到主题"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误"}

        };
        auto it = err_map.find(code);
        if(it == err_map.end())
            return "未知错误!";
        return it->second;
    }
    enum class RType
    {
        REQ_SYNC = 0,
        REQ_ASYNC,
        REQ_CALLBACK
    };
    enum class TopicOptype
    {
        TOPIC_CREATE = 0,
        TOPIC_REMOVE,
        TOPIC_SUBSCRIBE,
        TOPIC_CANCEL,
        TOPIC_PUBLISH
    };
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0,
        SERVICE_DISCOVERY,
        SERVICE_ONLINE,
        SERVICE_OFFLINE,
        SERVICE_UNKNOW
    };
 }